from Tkinter import *
#Modulo para utilizacao de MessageBoxes
import tkMessageBox
#Modulo para manipulacao de objetos em arquivos
import pickle

import Aluno

#O objetivo desta classe eh controlar a movimentacao dos dados em relacao a logica do programa
class bancoDeDados:
    def __init__(self):
        
        #Declaracao das tabelas para manipulacao quando as informacoes dos arquivos estiverem na memoria               
        self.tabelaUsuario = []
        self.tabelaFuncionario = []
        self.tabelaProfessor = []
        self.tabelaAluno = []
        self.tabelaEmprestimo = []
        self.tabelaLivro =[]
        
        #Declaracao dos nomes e enderecos de onde estao localizados os arquivos contendo as informacoes
        #sobre os objetos criado durante cada sessao do programa
        self.arqUsuario = 'Usuario.tab'
        self.arqFuncionario = 'Funcionario.tab'
        self.arqEmprestimo = 'Emprestimo.tab'
        self.arqAluno = 'Alunos.tab'
        self.arqEmprestimo = 'Emprestimo.tab'
        self.arqLivro = 'Livro.tab'
        
    #Esse metodo serve para carregar para a memoria todos os objetos anteriormente armazenados nos arquivos
    #Pelo seu formato, ela serve para todos os arquivos.
    def extrairDoArquivo(self, nomeDoArquivo):
        try:
            #Abre o arquivo fornecido como parametro
            arquivo = open(nomeDoArquivo)
            #Objeto lista para armazenar os dados que serao tirados do aquivo
            lista = []
            #Operacao propriamente dita de extracao dos dados e armazenamento na lista da memoria
            lista = pickle.load(arquivo)
            #Fechamento do arquivo            
            arquivo.close()
            #Retorno da lista 
            return lista            
        except:
            #Entra nesse bloco se o arquivo nao existir
            #Exibe uma mensagem informando que nao foi possivel abrir o arquivo
            tkMessageBox.showwarning('Abrindo arquivo...', 'Erro ao abrir arquivo.')
            #Cria um objeto lista para ser armazenado no arquivo
            lista = []
            #Cria um arquivo para gravacao de dados binarios
            arquivo = open(nomeDoArquivo, 'wb')
            #Serializacao do objeto lista no arquivo
            pickle.dump(lista, arquivo)
            #Fechamento do arquivo
            arquivo.close()
            #Retorno da lista
            return lista
        
    #Metodo para insercao de uma lista de objetos no arquivo indicado    
    def inserirNoArquivo(self, listaDeObjetos, nomeDoArquivo):
        try:
            #Abre o arquivo para escrita de dados binarios
            arquivo = open(nomeDoArquivo, 'wb')
            #Operacao para serializacao do objeto lista no arquivo
            pickle.dump(listaDeObjetos, arquivo)
            #Fechamento do arquivo
            arquivo.close()            
        except:
            #Se o arquivo nao existir exibe uma mensgem informando o problema
            tkMessageBox.showwarning('Aviso', 'Arquivo para gravacao nao encontrado\nArquivo foi criado.')
            #Cria um arquivo para gravacao de dados binarios
            arquivo = open(nomeDoArquivo, 'wb')
            #Serializa a lista no arquivo
            pickle.dump(listaDeObjetos, arquivo)
            #Fechamento do arquivo
            arquivo.close()
    
    #Metodo para busca de aluno no arquivo de alunos com base na matricul
    def busca_aluno(self, objAluno):
        self.tabelaAluno = []
        self.tabelaAluno = self.extrairDoArquivo(self.arqAluno)
        for aluno in self.tabelaAluno:
            #print aluno.getNome(), aluno.getMatricula()
            if aluno.getMatricula() == objAluno.getMatricula():
                return True
        return False
    
    #Metodo para procurar funcionario
    def busca_funcionario(self, objFuncionario):
        self.tabelaFuncionario = []
        self.tabelaFuncionario = self.extrairDoArquivo(self.arqFuncionario)
        for funcionario in self.tabelaFuncionario:
            if funcionario.getNome() == objFuncionario.getNome():
                return True
        return False
    
            
            
            
            
            
        
bd = bancoDeDados()
#print bd.extrairDoArquivo("tabelaDeAlunos.tab")
#bd.inserirNoArquivo(['a','v','c'], 'tabelaDeAlunos.tab')
        